![]() | PROGRAMACIÓN ORIENTADA A RESTRICCIONES |
|
| Una de las soluciones del problema de las 8 reinas |
(i1 … i8), en donde ij es la columna ocupada por la reina de la fila j, la expresión de la solución, junto con las restricciones, es la siguiente:
s = {〈([i[1…8]]) ← ij≠ik ← j≠k ← (abs(ij−ik) ≠ abs(j−k))
← j≥1 ← j≤8 ← k≥1 ← k≤8 〉}
(2 4 5 8 3 1 7 5).
ij≠ik ← j≠k es la no pertenencia a la misma fila.
abs(ij−ik) ≠ abs(j−k) es la no pertenencia a la misma diagonal. Cuando dos reinas están en una misma diagonal, la diferencia (en valor absoluto) entre sus respectivas filas es igual a la diferencia (en valor absoluto) entre sus respectivas columnas.
abs es el valor absoluto de un número entero:
〈( abs(m) = (−m ← m<0 →' m) )〉 // m indica número entero
n reinas es:
〈( s(n) = {〈([i⌊1…n⌋]) ← ij≠ik ← j≠k ← (abs(ij−ik) ≠ abs(j−k))
← j≥1 ← j≤n ← k≥1 ← k≤n 〉} )〉
n=2 y n=3.
n=4 tiene una única solución: (2 4 1 3).
|
| La única solución del problema de las 4 reinas |
( CondCol =: (ij≠ik ← j≠k) ) // condición de distinta columna
( CondDiag =: (abs(ij−ik) ≠ abs(j−k)) ) // condición de distinta diagonal
( CondGen =: (j≥1 ← j≤n ← k≥1 ← k≤n) ) // condición general
〈( s(n) = {〈([i⌊1…n⌋]) ← CondCol ← CondDiag ← CondGen〉} )〉